package top.lshaci.learning.jvm.gc;

/**
 * LocalVarGC
 *
 * @author lshaci
 * @date 2020/8/6 14:20
 * @since 1.0.0
 */
public class LocalVarGC {

    public void localVarGC1() {
        byte[] _10M = new byte[10 * 1024 * 1024];
        System.gc();
    }

    public void localVarGC2() {
        byte[] _10M = new byte[10 * 1024 * 1024];
        _10M = null;
        System.gc();
    }

    public void localVarGC3() {
        {
            byte[] _10M = new byte[10 * 1024 * 1024];
        }
        /**
         * _10M 仍然占用着局部变量表索引为1的位置
         * 所以不会被回收
         */
        System.gc();
    }

    public void localVarGC4() {
        {
            byte[] _10M = new byte[10 * 1024 * 1024];
        }
        /**
         * _10M 占用的 局部变量表索引为1的位置 被value替代
         * 所以回被回收
         */
        int value = 10;
        System.gc();
    }

    public void localVarGC5() {
        localVarGC1();
        System.gc();
    }

    /**
     * -XX:+PrintGCDetails
     */
    public static void main(String[] args) {
        // [PSYoungGen: 14175K->10728K(76288K)]
        LocalVarGC local = new LocalVarGC();
//        local.localVarGC1(); // _10M没有被回收

        // [PSYoungGen: 14175K->744K(76288K)]
//        local.localVarGC2(); // _10M被回收(744K 小于10M了)

        // [PSYoungGen: 14175K->10728K(76288K)]
//        local.localVarGC3(); // _10M没有被回收

        // [PSYoungGen: 14175K->776K(76288K)]
//        local.localVarGC4(); // _10M被回收(776K 小于10M了)

        /**
         * 第一次gc：_10M被放到老年代了
         * [GC (System.gc()) [PSYoungGen: 14175K->10744K(76288K)]
         * [Full GC (System.gc()) [PSYoungGen: 10744K->0K(76288K)] [ParOldGen: 160K->10850K(175104K)]
         *
         * 第二次gc：_10M在老年代被回收了
         * [GC (System.gc()) [PSYoungGen: 0K->0K(76288K)]
         * [Full GC (System.gc()) [PSYoungGen: 0K->0K(76288K)] [ParOldGen: 10850K->610K(175104K)]
         */
        local.localVarGC5();
    }
}
